import { Peer, DataConnection } from 'peerjs'
import { defineStore } from 'pinia'
import { getIp } from '@/api/user.ts'
import { ref } from 'vue'

// 定义连接状态类型，包括：未连接、连接中、已连接
type ConnectionStatus = 'disconnected' | 'connecting' | 'connected'

export const usePeerStore = defineStore('peerjs', () => {
  // 状态
  const peer = ref<Peer | null>(null) // 当前 Peer 实例
  const connection = ref<DataConnection | null>(null) // 当前数据连接
  const publicIP = ref<{
    code?: number
    message?: string
    data?: string
  }>({
    data: ''
  }) // 用户的公共 IP 信息
  const status = ref<ConnectionStatus>('disconnected') // 连接状态
  const error = ref<string | null>(null) // 错误信息

  // 初始化 Peer 实例
  const initPeer = async () => {
    try {
      status.value = 'connecting' // 设置状态为连接中
      publicIP.value = await getIp() // 获取用户的公共 IP
      if (publicIP.value.code === 500) {
        throw new Error('Failed to get public IP') // 如果获取 IP 失败，抛出错误
      }
      const peerId = publicIP.value.data || '' // 使用获取的 IP 作为 Peer ID
      peer.value = new Peer(peerId, {
        host: 'localhost',
        port: 5173,
        path: '/peerjs/myApp',
        debug: 3
      }) // 创建 Peer 实例

      // 事件监听
      peer.value.on('open', (id) => {
        console.log('Peer ID:', id)
        status.value = 'connected' // 当 Peer 成功打开时，设置状态为已连接
      })

      peer.value.on('connection', (conn: DataConnection) => {
        connection.value = conn // 当有新的连接时，设置当前连接
        setupConnectionListeners() // 设置连接监听器
      })

      peer.value.on('error', (err) => {
        error.value = `Peer error: ${err.type}` // 当发生错误时，设置错误信息
        status.value = 'disconnected' // 设置状态为未连接
      })
    } catch (err) {
      error.value = (err as Error).message // 捕获异常并设置错误信息
      status.value = 'disconnected' // 设置状态为未连接
      alert(error.value) // 弹出错误提示
    }
  }

  // 连接其他 Peer
  const connectToPeer = (remotePeerId: string) => {
    if (!peer.value) throw new Error('Peer not initialized') // 如果 Peer 未初始化，抛出错误

    connection.value = peer.value.connect(remotePeerId) // 尝试连接到远程 Peer
    setupConnectionListeners() // 设置连接监听器
  }

  // 断开连接
  const disconnect = () => {
    if (!connection.value) throw new Error('No connection to disconnect from') // 如果没有连接，抛出错误

    connection.value.close() // 关闭当前连接
    connection.value = null // 重置连接状态
    status.value = 'disconnected' // 设置状态为未连接
  }

  // 设置连接监听器
  const setupConnectionListeners = () => {
    if (!connection.value) return // 如果没有连接，直接返回

    connection.value.on('open', () => {
      console.log('Connection established') // 当连接建立时，输出日志
      return connection.value
    })

    connection.value.on('data', (data) => {
      console.log('Received data:', data) // 当接收到数据时，输出日志
      return data
    })

    connection.value.on('close', () => {
      console.log('Connection closed') // 当连接关闭时，输出日志
      connection.value = null // 重置连接状态
      return null
    })
  }

  // 发送数据
  const sendData = (data: any) => {
    if (connection.value?.open) {
      connection.value.send(data) // 如果连接是打开的，发送数据
    }
  }

  // 返回商店中的状态和操作函数
  return {
    peer,
    connection,
    publicIP,
    status,
    error,
    initPeer,
    sendData,
    connectToPeer,
    disconnect
  }
})
